load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")

package(default_visibility = ["//:__subpackages__"])

cc_binary(
    name = "cdc_fuse_fs",
    srcs = ["main.cc"],
    deps = [
        ":cdc_fuse_fs_lib",
        ":constants",
        "//absl_helper:jedec_size_flag",
        "//common:client_socket",
        "//common:gamelet_component",
        "//common:log",
        "//common:server_socket",
        "//data_store:data_provider",
        "//data_store:disk_data_store",
        "//data_store:grpc_reader",
        "@com_google_absl//absl/flags:parse",
    ],
)

# Dependencies for cdc_fuse_fs_lib, except for FUSE.
cdc_fuse_fs_lib_shared_deps = [
    ":asset",
    ":asset_stream_client",
    ":config_stream_client",
    "//common:log",
    "//common:path",
    "//common:platform",
    "//common:util",
    "//common:threadpool",
    "@com_github_jsoncpp//:jsoncpp",
]

cc_library(
    name = "cdc_fuse_fs_lib",
    srcs = ["cdc_fuse_fs.cc"],
    hdrs = ["cdc_fuse_fs.h"],
    target_compatible_with = ["@platforms//os:linux"],
    deps = cdc_fuse_fs_lib_shared_deps + ["@com_github_fuse//:fuse_shared"],
)

cc_library(
    name = "cdc_fuse_fs_lib_mocked",
    srcs = ["cdc_fuse_fs.cc"],
    hdrs = ["cdc_fuse_fs.h"],
    copts = ["-DUSE_MOCK_LIBFUSE=1"],
    deps = cdc_fuse_fs_lib_shared_deps + [":mock_libfuse"],
)

cc_test(
    name = "cdc_fuse_fs_test",
    srcs = ["cdc_fuse_fs_test.cc"],
    deps = [
        ":cdc_fuse_fs_lib_mocked",
        ":mock_config_stream_client",
        "//common:status_test_macros",
        "//data_store",
        "//data_store:mem_data_store",
        "//manifest:fake_manifest_builder",
        "//manifest:manifest_builder",
        "@com_google_absl//absl/status",
        "@com_google_googletest//:gtest",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_library(
    name = "mock_libfuse",
    srcs = ["mock_libfuse.cc"],
    hdrs = ["mock_libfuse.h"],
    deps = ["//common:platform"],
)

cc_library(
    name = "constants",
    hdrs = ["constants.h"],
)

cc_library(
    name = "asset_stream_client",
    srcs = ["asset_stream_client.cc"],
    hdrs = ["asset_stream_client.h"],
    deps = [
        "//common:log",
        "//common:status_macros",
        "//common:stopwatch",
        "//manifest:manifest_proto_defs",
        "//proto:asset_stream_service_grpc_proto",
        "@com_google_absl//absl/status:statusor",
    ],
)

cc_library(
    name = "asset",
    srcs = ["asset.cc"],
    hdrs = ["asset.h"],
    deps = [
        "//common:buffer",
        "//common:status",
        "//data_store",
        "//manifest:content_id",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/synchronization",
    ],
)

cc_test(
    name = "asset_test",
    srcs = ["asset_test.cc"],
    deps = [
        ":asset",
        "//common:path",
        "//common:platform",
        "//common:status_test_macros",
        "//data_store:mem_data_store",
        "@com_google_googletest//:gtest",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_library(
    name = "config_stream_client",
    srcs = ["config_stream_client.cc"],
    hdrs = ["config_stream_client.h"],
    deps = [
        "//common:grpc_status",
        "//common:log",
        "//manifest:content_id",
        "//proto:asset_stream_service_grpc_proto",
        "@com_google_absl//absl/status",
    ],
)

cc_library(
    name = "mock_config_stream_client",
    srcs = ["mock_config_stream_client.cc"],
    hdrs = ["mock_config_stream_client.h"],
    deps = [":config_stream_client"],
)

filegroup(
    name = "all_test_sources",
    srcs = glob(["*_test.cc"]),
)
